package main

import (
	"fmt"
	"sync"
)

//多个协程操作同一个数据的时候，解决问题用的是互斥锁

// 定义一个变量
var k1 int

// 定义waitGroup
var wg1 = sync.WaitGroup{}

// 定义锁
var lock sync.Mutex

func add1() {

	for i := 0; i < 100000; i++ {
		lock.Lock() //加锁
		k1 = k1 + 1
		lock.Unlock() //解锁
	}
	defer wg1.Done()
}
func sub1() {

	for i := 0; i < 100000; i++ {
		lock.Lock() //加锁
		k1 = k1 - 1
		lock.Unlock() //解锁

	}
	defer wg1.Done()
}

// 多个协程操作同一个变量
func main() {
	wg1.Add(1)
	go add1() //启动协程
	wg1.Add(1)
	go sub1()
	wg1.Wait()
	//这个语句一定要在wg.wait()之后输出，否则会认为只是简单的main里的一个逻辑
	fmt.Println(k1)
}
